package com.util;

import java.util.List;

 import org.dom4j.Attribute;
 import org.dom4j.Document;
 import org.dom4j.DocumentException;
 import org.dom4j.DocumentHelper;
 import org.dom4j.Element;

 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;

  /**
   *XML转JSON
   *
   */
 public class XmlToJsonUtils {

     /**
      * String 转 org.dom4j.Document
      * @param xml
      * @return
      * @throws DocumentException
      */
     public static Document strToDocument(String xml) throws DocumentException {
         return DocumentHelper.parseText(xml);
     }

     /**
      * org.dom4j.Document 转  com.alibaba.fastjson.JSONObject
      * @param xml
      * @return
      * @throws DocumentException
      */
     public static String documentToJSONObject(String xml) throws DocumentException {

         Element rootElement = strToDocument(xml).getRootElement();
         JSONObject childJson= elementToJSONObject(rootElement);

         JSONObject rootJson =new JSONObject();
         // 以XML根节点的名称，JSON的根元素
         rootJson.put(rootElement.getName(),childJson);
         return rootJson.toString();
     }

     /**
      * org.dom4j.Element 转  com.alibaba.fastjson.JSONObject
      * @param node
      * @return
      */
     public static JSONObject elementToJSONObject(Element node) {

          JSONObject result = new JSONObject();
         // 当前节点的名称、文本内容和属性
         List<Attribute> listAttr = node.attributes();// 当前节点的所有属性的list
         for (Attribute attr : listAttr) {// 遍历当前节点的所有属性
             result.put(attr.getName(), attr.getValue());
         }
         // 递归遍历当前节点所有的子节点
         List<Element> listElement = node.elements();// 所有一级子节点的list
         if (!listElement.isEmpty()) {
             for (Element e : listElement) {// 遍历所有一级子节点
                 if (e.attributes().isEmpty() && e.elements().isEmpty()) // 判断一级节点是否有属性和子节点
                     result.put(e.getName(), e.getTextTrim());// 沒有则将当前节点作为上级节点的属性对待
                 else {
                     if (!result.containsKey(e.getName())) // 判断父节点是否存在该一级节点名称的属性
                         result.put(e.getName(), new JSONArray());// 没有则创建
                     ((JSONArray) result.get(e.getName())).add(elementToJSONObject(e));// 将该一级节点放入该节点名称的属性对应的值中
                 }
             }
         }
         return result;
     }

      public static void main(String[] args) throws DocumentException {
            String xml="<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" +
                    "<results>\n" +
                    "  <result returncode=\"RSSMC_ERROR_CODE_AUTH_FAILED\">\n" +
                    "    <errorMsg>用户test不存在!</errorMsg>\n" +
                    "  </result>\n" +
                    "<limit>123</limit>>"+
                    "</results>\n";
          String jsonObject=documentToJSONObject(xml);
          System.out.println(jsonObject);
      }

 }